package com.cat.model.web.action.callback;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.cat.model.biz.component.alipay.util.AlipayNotify;
import com.cat.model.biz.logic.OrderLogic;
import com.cat.model.common.util.LoggerManager;
import com.cat.model.web.action.base.BaseAction;

public class AliPayAppNotifyAction extends BaseAction{
	/**
	 * 
	 */
	private static final long serialVersionUID = -204473528396675390L;
	
	@Autowired
	private OrderLogic orderLogic;
	
	public void doNotify() throws Exception{
		System.out.println("支付宝通知进入=========================");
		//获取支付宝POST过来反馈信息
		Map<String,String> params = new HashMap<String,String>();
		Map requestParams = request.getParameterMap();
		
		LoggerManager.alipay.info("requestParams:"+requestParams);
		
		for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i]
						: valueStr + values[i] + ",";
			}
			//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
			//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
			params.put(name, valueStr);
			
			LoggerManager.alipay.info(name + ":"+ valueStr);
		}
		
		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		//商户订单号

		String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

		//支付宝交易号

		String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

		//交易状态
		String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
		
		BigDecimal payAmount = new BigDecimal("0.00");
		if(StringUtils.isNotEmpty(request.getParameter("total_fee"))){
			String total_fee =  new String(request.getParameter("total_fee").getBytes("ISO-8859-1"),"UTF-8");
			if(StringUtils.isNumeric(total_fee)){
				payAmount = new BigDecimal(total_fee);
			}
		}

		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
		LoggerManager.alipay.info("trade_no:"+trade_no);
		if(AlipayNotify.verify(params)){//验证成功
			LoggerManager.alipay.info("validate success");
			//////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代码
			String SPLIT_CHAR = "Z";
			if(out_trade_no.contains(SPLIT_CHAR)){
				int index = out_trade_no.lastIndexOf(SPLIT_CHAR);
				out_trade_no = out_trade_no.substring(0, index);
			}
			
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			
			if(trade_status.equals("TRADE_FINISHED")){
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序
				String result=orderLogic.updateOrderSuccess(out_trade_no, "alipay", trade_no, payAmount);
				
				if("200".equals(result)){
					print("success");	//请不要修改或删除

				}else{
					print("fail");
				}
			} else if (trade_status.equals("TRADE_SUCCESS")){
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序
				String result=orderLogic.updateOrderSuccess(out_trade_no, "alipay", trade_no, payAmount);
				if("200".equals(result)){
					print("success");	//请不要修改或删除

				}else{
					print("fail");
				}
			}

		}else{//验证失败
			print("fail");
			LoggerManager.alipay.info("validate fail");
		}
	}
	
	public static void main(String[] args){
		String out_trade_no = "1111111111Z39u4304u55Z0013";
		String SPLIT_CHAR = "Z";
		if(out_trade_no.contains(SPLIT_CHAR)){
			int index = out_trade_no.lastIndexOf(SPLIT_CHAR);
			System.out.println(out_trade_no.substring(0, index));
		}
	}
}
